home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Run Magazine ReRun 1989 Special Issue
/
rerun-1989-special-issue.d64
/
irq source#3
< prev
next >
Wrap
Text File
|
2022-09-20
|
5KB
|
127 lines
*= $C000 ; Start address
; Ball Animation
; Interrupt demo
SEI ; Set Interrupt Disable Flag
LDA #<NEWIRQ ; Change IRQ RAM vector
STA $0314
LDA #>NEWIRQ
STA $0315
CLI ; Clear Interrupt Disable Flag
LDX #$10 ; Set Sprite Location Registers
ILOOP
LDA SP,X ; ($D000-D010) set to initial values
STA $D000,X ; From table SP
DEX
BPL ILOOP
LDX #$07 ; Set Sprite Color Registers
CLOOP
LDA SC,X ; ($D027-D02E) to values in table SC
STA $D027,X
LDA #$0B ; and Sprite Pointers ($07F8-$07FF)
STA $07F8,X ; to sprite block 11
DEX
BPL CLOOP
LDA #0 ; Initialize other VIC registers
STA $D017 ; X-expand
STA $D01C ; Multicolor
STA $D01D ; Y-expand
STA $D020 ; Border Color (Black)
STA $D021 ; Background Color (Black)
LDA #$FF
STA $D015 ; Sprite Enable Register
LDX #$3F ; Put Sprite Data in Block 11
; ($02C0-$02FF)
SLOOP
LDA BALL,X ; Data in Table BALL
STA $02C0,X
DEX
BPL SLOOP
JSR EXP ; (For further expansion)
RTS
NEWIRQ
NOP ; (For further expansion)
NOP
NOP
CONT
LDX #$0F ; Set X to $0F - end of Sprite
; Position
MLOOP
TXA ; Main loop - save bit 0
; (0=X value, 1=Y value)
LSR ; Put in Carry Flag
PHP ; Save Carry Flag
TAY ; Set Mask Bit for MSB register ($D010)
SEC
LDA #0
BLOOP
ROL
DEY
BPL BLOOP
TAY ; Store Mask in Y register
PLP ; Retrieve Carry Flag (Bit 0)
LDA SD,X ; Get direction of corresponding
; position register
BPL REGINC ; If increasing, go to RECINC
DEC $D000,X ; Decrease value of position register
BNE NEXT ; If > 0 then do next register
BCS NEXT ; If a Y-position, then do next
; register
TYA ; Get MSB register mask
EOR $D010 ; Toggle appropriate bit of MSB register
STA $D010
TYA ; Get MSB mask again
AND $D010 ; Test appropriate bit of MSB register
BEQ NEXT ; If not set then do next register
LDA #$5B ; Load A with $5B (91), Put in X position
STA $D000,X ; Register if sprite wraps around
; left side
JMP NEXT ; Next register
REGINC
INC $D000,X ; Increase value of position register
BCS NEXT ; If a Y position, do next register
BNE CHECKX ; If not 0 check right edge of screen
TYA ; Get mask bit
ORA $D010 ; Set MSB
STA $D010
JMP NEXT ; Do next register
CHECKX
LDA $D000,X ; Get current X position
CMP #$5B ; Compare to $5B (91)
BNE NEXT ; If not 91 then do next register
TYA ; Get mask
AND $D010 ; Test MSB register
BEQ NEXT ; If not at right edge, do
; next register
LDA #0 ; Put sprite at left edge
STA $D000,X
TYA
EOR $D010
STA $D010
NEXT
DEX ; Decrement X - point to next position
; register
BPL MLOOP ; If not done, do again
JMP $EA31 ; Go to KERNAL IRQ routine
SP
.BYTE 155 90 205 95 255 130 250 175 ; Initial
; positions
.BYTE 205 205 155 210 110 170 105 135 0
SC
.BYTE 8 9 10 11 12 13 14 15 ; Sprite colors
SD
.BYTE 0 128 128 0 128 128 128 0 ; Direction
.BYTE 0 0 128 128 0 128 0 0 ; 0=INC, 128=DEC
BALL
.BYTE 0 0 0 1 255 128 7 31 ; Sprite Data
.BYTE 224 12 255 240 31 255 248 63
.BYTE 15 252 126 15 254 124 15 254
.BYTE 248 112 63 248 240 255 248 255
.BYTE 255 248 240 255 248 112 63 124
.BYTE 15 254 126 15 254 63 15 252
.BYTE 31 255 248 15 255 48 7 248
.BYTE 224 1 255 128 0 0 0 0
EXP
RTS